home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The PC-SIG Library 9
/
The PC-SIG Library on CD ROM - Ninth Edition.iso
/
301_400
/
DISK0353
/
DISK0353.ZIP
/
OKIGRAFX.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1984-09-17
|
17KB
|
550 lines
program graphicsOnOkidata;
{(c) 1984 by Neil J. Rubenking}
var
ToggleByte : byte absolute $40:$17;
ScrollLock : byte;
BigRow, BigCol, {BigRow & LastRow go from 1 to 55 by threes}
LastRow, LastCol, {BigCol & LastCol go from 1 to 561 by forties}
rows,cols,
ScreenSeg : integer;
up, color : boolean;
Key1,Key2 : char;
ScreenDots : array[1..42] of array[1..80] of boolean;
Graffix : array[1..60] of array[1..640] of byte;
PosX, PosY : integer;
GrafxFile : text;
GrafxFileName : string[14];
BlankLine : string[79];
{============================================================================}
function ReadScreen(col,row:byte):char;
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
ReadScreen := chr(Mem[ScreenSeg:LocationCode]);
end;
{============================================================================}
procedure WriteScrn(col, row: byte; thisChar:char);
var
LocationCode : integer;
begin
LocationCode := (col-1)*2 + (row-1)*160;
Mem[ScreenSeg:locationCode] := ord(ThisChar);
end;
{============================================================================}
procedure blankScreen;
var
LocationCode : integer;
col, row : byte;
begin
for col := 1 to 80 do
begin
for row := 1 to 21 do
begin
LocationCode := (col-1)*2 + (row-1)*160;
Mem[ScreenSeg:locationCode] := 32; { a blank }
Mem[ScreenSeg:locationCode+1] := 112;
end;
end;
end;
{============================================================================}
{This procedure takes the array "GRAFFIX", which contains the graphics printer
codes, and converts it into an array that can be shown on the screen }
procedure MakeScreen(bigCol,bigRow:integer);
var
thisByte,
bits : byte;
M, N : integer;
thisChar : char;
begin
for M := BigCol to BigCol + 79 do
begin
for N := BigRow to BigRow + 5 do
begin
thisByte := Graffix[N][M];
for bits := 1 to 7 do
begin
if odd(thisbyte) then
screenDots[(N-BigRow)*7 + bits][M-BigCol+1] := true
else
screenDots[(N-BigRow)*7 + bits][M-BigCol+1] := false;
thisByte := thisByte div 2;
end; {for bits}
end; {for N := 1 to 6}
for N := 1 to 21 do
begin
if screenDots[2*N-1][M-BigCol+1] then
begin
if screenDots[2*N][M-BigCol+1] then
begin
ThisChar := '█';
end
else ThisChar := '▀'
end
else
begin
if screenDots[2*N][M-BigCol+1] then
begin
ThisChar := '▄';
end
else ThisChar := ' ';
end;
writeScrn((M-BigCol+1),N,thisChar);
end; {for N := 1 to 21}
end; {for M}
end; {procedure}
{============================================================================}
{Converts the current screen into printer graphics codes}
procedure SaveScreen;
var
dotPos, chNum, doubler : byte;
N, M : integer;
begin
for M := 1 to 80 do
begin
for N := 1 to 21 do
begin
case ReadScreen(M,N) of
'▀': begin
ScreenDots[(N*2)-1][M] := true;
ScreenDots[(N*2)][M] := false;
end;
'▄': begin
ScreenDots[(N*2)-1][M] := false;
ScreenDots[(N*2)][M] := true;
end;
' ': begin
ScreenDots[(N*2)-1][M] := false;
ScreenDots[(N*2)][M] := false;
end;
'█': begin
ScreenDots[(N*2)-1][M] := true;
ScreenDots[(N*2)][M] := true;
end;
end; {case}
end; {for N := 1 to 21}
for N := 1 to 6 do
begin
doubler := 1;
chNum := 0;
for dotPos := 1 to 7 do
begin
if ScreenDots[7*(N-1)+dotPos][M] then chNum := chNum + doubler;
doubler := 2*doubler;
end;
Graffix[N+BigRow-1][M+BigCol-1] := chNum;
end; {for N := 1 to 6}
end; {for M := 1 to 80}
end;
{============================================================================}
{Prints to either Printer or file--the printer can qualify as a "text file" }
procedure doPrint(var which:text);
var
N, M: byte;
begin
write(which,chr(3)); {turn on graphics}
for N := 1 to LastRow + 5 do
begin
for M := 1 to LastCol + 79 do
begin
write(which,chr(Graffix[N][M])); {in order to print}
if Graffix[N][M] = 3 then write(which,chr(3)); {chr(3) you must }
end; {for M} {print it twice }
Write(which, chr(3),chr(14)); {end of graphics line code}
end; {for N}
write(which,chr(3),chr(2)); {turn off graphics}
end;
{============================================================================}
procedure PrintInstructions;
begin
GotoXY(1,23);
writeln(BlankLine);
write(BlankLine);
gotoXY(1,23);
Write('F1=set F2=erase F3=save/print F4=retrieve F7=start over ');
WriteLn('F9=blank F10=end');
Write('Ctrl-left, right, PgUp, PgDn move "window". ');
WriteLn('Ctrl-home & end go to extremes. ');
end;
{============================================================================}
procedure cursorSet(mode : char);
type
regpack = record
ax,bx,cx,dx,bp,di,si,ds,es,flags: integer;
end;
var
recpack: regpack; {assign record}
ah,al,ch,cl,dh: byte;
begin
ah := 1;
if color then
case mode of
'h': begin ; ch := 0 ; cl := 3 ; end;
'l': begin ; ch := 4 ; cl := 7 ; end;
'n': begin ; ch := 6 ; cl := 7 ; end;
end
else
case mode of
'h': begin ; ch := 0 ; cl := 6 ; end;
'l': begin ; ch := 7 ; cl := 13 ; end;
'n': begin ; ch := 12 ; cl := 13 ; end;
end;
with recpack do
begin
ax := ah shl 8;
cx := ch shl 8 + cl;
end;
intr($10,recpack); {call interrupt}
end;
{============================================================================}
procedure AskPrint;
var
pick : char;
SaveX,SaveY : byte;
begin
SaveX := WhereX;
SaveY := WhereY;
CursorSet('n');
window(1,1,80,25);
gotoXY(1,23);
writeln(BlankLine);
write(BlankLine);
gotoXY(1,23);
Write('P for Printer, F for File: ');
repeat
read(pick);
write(chr(8));
until UpCase(pick) in ['P','F'];
if UpCase(pick) = 'P' then DoPrint(Lst)
else
begin
gotoXY(1,23);
write('Enter FileName--no extension.');
read(GrafxFileName);
GrafxFileName := GrafxFileName + '.OKI';
Assign(GrafxFile, GrafxFileName);
rewrite(GrafxFile);
DoPrint(GrafxFile);
close(GrafxFile);
end;
PrintInstructions;
window(1,1,80,22);
GotoXY(SaveX,SaveY);
if up then CursorSet('h') else CursorSet('l');
end;
{============================================================================}
procedure initialize;
begin
IF (Mem[0000:1040] AND 48) <> 48 THEN
begin
ScreenSeg := $B800;
color := true;
end
ELSE
begin
ScreenSeg := $B000;
color := false;
end;
window(1,1,80,25);
textcolor(black);
textBackground(white);
GotoXY(1,23);
Write('I N I T I A L I Z I N G . . . .');
BlankScreen;
for rows := 1 to 60 do
for cols := 1 to 640 do
Graffix[rows][cols] := 0;
printInstructions;
window(1,1,80,22);
BlankLine := ' ';
BlankLine := BlankLine + BlankLine;
gotoXY(1,1);
up := true;
BigRow := 1;
LastRow := 1;
BigCol := 1;
LastCol := 1;
CursorSet('h');
end;
{============================================================================}
procedure DoRetrieve(var ThisFile : text);
var
This, Next, ThrowOut : char;
row : byte;
MaxCol, col : integer;
begin
initialize;
row := 1;
col := 1;
this := chr(0);
next := chr(0);
reset(ThisFile);
read(ThisFile,ThrowOut);
while not EOF(ThisFile) do
begin
read(ThisFile,this);
if this = chr(3) then
begin
read(ThisFile,next);
case ord(Next) of
3: begin
Graffix[row][col] := ord(this);
col := col + 1;
end;
14: begin
row := row + 1;
col := 1;
end;
2: ;
else
Graffix[row][col] := ord(this);
col := col + 1;
Graffix[row][col] := ord(next);
col := col + 1;
end; {case}
end {if}
else
begin
Graffix[row][col] := ord(this);
col := col + 1;
end;
if col > MaxCol then MaxCol := col;
end; {while}
LastRow := row - 5;
LastCol := MaxCol - 79;
close(Thisfile);
MakeScreen(BigCol,BigRow);
window(1,1,80,25);
PrintInstructions;
window(1,1,80,22);
gotoXY(1,1);
up := true;
CursorSet('h');
end;
{============================================================================}
procedure AskRetrieve;
begin
CursorSet('n');
window(1,1,80,25);
gotoXY(1,23);
writeln(BlankLine);
write(BlankLine);
gotoXY(1,23);
WriteLn('Enter FileName--no extension: ');
read(GrafxFileName);
GrafxFileName := GrafxFileName + '.OKI';
Assign(GrafxFile,GrafxFileName);
DoRetrieve(GrafxFile);
end;
{============================================================================}
procedure DoInsert; {Not yet implemented}
begin
end;
{============================================================================}
procedure TakeOrders;
{--------------------------------------}
procedure GoUp;
begin
if not up then
begin
up := true;
CursorSet('h');
end
else
if WhereY > 1 then
begin
up := false;
CursorSet('l');
GotoXY(WhereX,WhereY-1);
end
else
begin
up := false;
CursorSet('l');
GotoXY(WhereX,21);
end;
end;
{--------------------------------------}
procedure GoDown;
begin
if up then
begin
up := false;
CursorSet('l');
end
else
if WhereY < 21 then
begin
up := true;
CursorSet('h');
GotoXY(WhereX,WhereY+1);
end
else
begin
up := true;
CursorSet('h');
GotoXY(WhereX,1);
end;
end;
{--------------------------------------}
procedure GoLeft;
begin
if WhereX > 1 then gotoXY(WhereX-1,WhereY) else gotoXY(80,WhereY);
end;
{--------------------------------------}
procedure GoRight;
begin
if WhereX < 80 then GotoXY(WhereX+1,WhereY) else gotoXY(1,WhereY);
end;
{--------------------------------------}
procedure WriteADot;
begin
if up then
begin
if ReadScreen(WhereX,WhereY) = '▄' then writeScrn(WhereX,WhereY,'█')
else writeScrn(WhereX,WhereY,'▀'); {if low then whl else high}
end
else
begin
if ReadScreen(WhereX,WhereY) = '▀' then writeScrn(WhereX,WhereY,'█')
else writeScrn(WhereX,WhereY,'▄');{if high then whl else low}
end;
end;
{--------------------------------------}
procedure EraseADot;
begin
if up then
begin
if ReadScreen(WhereX,WhereY) = '█' then writeScrn(WhereX,WhereY,'▄')
else writeScrn(WhereX,WhereY,' ');
end {if whl then low else space}
else
begin
if ReadScreen(WhereX,WhereY) = '█' then writeScrn(WhereX,WhereY,'▀')
else writeScrn(WhereX,WhereY,' ');
end; {if whl then high else space}
end;
{--------------------------------------}
begin
repeat until keypressed;
read(Kbd,Key1);
if Key1 = chr(27) then
begin
read(Kbd,Key2);
case Key2 of
{home} 'G': begin
if ScrollLock = 16 then WriteADot;
GoUp;
GoLeft;
end;
{up} 'H': begin
if ScrollLock = 16 then WriteADot;
GoUp;
end;
{PgUp} 'I': begin
if ScrollLock = 16 then WriteADot;
GoUp;
GoRight;
end;
{left} 'K': begin
if ScrollLock = 16 then WriteADot;
GoLeft;
end;
{right} 'M': begin
if ScrollLock = 16 then WriteADot;
GoRight;
end;
{end} 'O': begin
if ScrollLock = 16 then WriteADot;
GoDown;
GoLeft;
end;
{down} 'P': begin
if ScrollLock = 16 then WriteADot;
GoDown;
end;
{PgDn} 'Q': begin
if ScrollLock = 16 then WriteADot;
GoDown;
GoRight;
end;
{Ctrl-home} 'w': begin {goes to top right of "Big Picture"}
SaveScreen;
BigRow := 1;
BigCol := 1;
MakeScreen(BigCol,BigRow);
GotoXY(1,1);
up := true;
CursorSet('h');
end; {ctrl-home}
{Ctrl-PgDn} 'v': if BigRow < 55 then {moves "window" down ½ screen}
begin
SaveScreen;
BlankScreen;
BigRow := BigRow + 3;
if LastRow < BigRow then LastRow := BigRow;
MakeScreen(BigCol,BigRow);
end; {ctrl-pgUp}
{Ctrl-left} 's': if BigCol > 40 then {moves "window" to left ½ screen}
begin
SaveScreen;
BlankScreen;
BigCol := BigCol - 40;
MakeScreen(BigCol,BigRow);
end;
{Ctrl-right}'t': if BigCol < 561 then {moves "window" to right ½ screen}
begin
SaveScreen;
BlankScreen;
BigCol := BigCol + 40;
if LastCol < BigCol then LastCol := BigCol;
MakeScreen(BigCol,BigRow);
end;
{Ctrl-end} 'u': begin {goes to bottom right of "big picture"}
SaveScreen;
BigRow := LastRow;
BigCol := LastCol;
MakeScreen(BigCol,BigRow);
GotoXY(80,21);
up := false;
CursorSet('l');
end; {ctrl-end}
{Ctrl-PgUp}'ä': if BigRow > 3 then {moves "window" up ½ screen}
begin
SaveScreen;
BlankScreen;
BigRow := BigRow - 3;
MakeScreen(BigCol,BigRow);
end; {ctrl-PgDn}
{F1} ';': WriteADot;
{F2} '<': EraseADot;
{F3} '=': begin
SaveScreen;
AskPrint;
end;
{F4} '>': AskRetrieve;
{F5} '?':;
{F6} '@':;
{F7} 'A':initialize;
{F8} 'B':;
{F9} 'C': BlankScreen;
{Ins} 'R': DoInsert;
end; {case statement}
end; {"if Key1 = chr(27)"}
end; {procedure}
{============================================================================}
begin
initialize;
repeat
ScrollLock := ToggleByte and 16;
TakeOrders;
until Key2 = 'D';
window(1,1,80,25);
ClrScr;
gotoXY(1,24);
CursorSet('n');
end.